/**   1----
// generator 生成器  生成的是迭代器
// 普通函数执行时 没有停止功能 gennerator函数 可以暂停

function*read() {
  yield 1; // 产出
  yield 2; // 产出
  yield 3; // 产出
  yield 4; // 产出
  return 5
}

let it = read() // iterator 迭代器中包含一个next方法
// 迭代器接口 Symbol.iterator

let done = false
while(!done) {
  let obj = it.next()
  done = obj.done
  console.log(obj.value)
  
}

// console.log(it.next()) // { value: 1, done: false } // {value, done} 碰搭配yield关键字就停止了
// console.log(it.next()) // { value: 2, done: false } 
// console.log(it.next()) // { value: 3, done: false }
// console.log(it.next()) // { value: 4, done: false }
// console.log(it.next()) // { value: undefined, done: true }
// console.log(it.next()) // { value: undefined, done: true }
*/

/** 
// 2 es6特性
function*read() {
  let a = yield 1;
  console.log(a)
  let b = yield 2;
  console.log(b)
  let c = yield 3;
  console.log(c)
}

let it = read()

let a = it.next('hello') // 第一次传递的参数 是无意义的 没输出
console.log('----')
console.log(a.value)
it.next('world') // next传递参数会给上一次yield的返回值
it.next('xxx')
*/

/** 
// generator + promise
const util = require('util')
const fs = require('fs')
let readFile = util.promisify(fs.readFile)

function*read() {// 暂停功能
  let content =  yield readFile(`${process.cwd()}/1.Promise/name.txt`, 'utf8')
  let age = yield readFile(`${process.cwd()}/1.Promise/${content}`, 'utf8')
  return age

  // return 12
}

// tj
function co(it) {
  return new Promise((resolve, reject)=> {
    // 异步迭代 需要next函数
    function next (r) {
      let {value, done} = it.next(r)
      if(done){
        resolve(value)
      }else {
        Promise.resolve(value).then(data => {
          next(data)
        }, reject)
      }
    }
    next()
  })
}
// 依次执行生成器 不停的调用next方法 将最终结果返回
co(read()).then(data => {
  console.log(data)
})

// let it = read()
// let {value} = it.next()
// value.then(data => {
//   let {value} = it.next(data)
//   value.then(data => {
//     let {value, done} = it.next(data)
//     console.log(value, done)
//   })
// })

*/

// 他编辑出来的结果就是 gennerator + co
async function gen() { // async 函数返回的就是一个promise
    // try {
      let r = await new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('hello')
        }, 1000)
      })
      console.log(r)
    // } catch (e) {
    //   console.log('error caught!')
    // }
}

gen().then(data => {}, err=> {
  console.log('---err--')
  console.log(err)
}).catch(err => {
  console.log('000err')
  console.log(err)
})

// 回去把promise原理搞定
// 1）柯里化和反柯里化
// 2）finally方法 race方法
